package fr.grobim.hangovers.gestionBudget.actions.comptes;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;

import fr.grobim.hangovers.gestionBudget.actions.champs.comptes.MembreChamps;
import fr.grobim.hangovers.gestionBudget.actions.enums.AttributsSession;
import fr.grobim.hangovers.gestionBudget.actions.support.AbstractActionSupport;
import fr.grobim.hangovers.gestionBudget.beans.comptes.CompteUtilisateur;
import fr.grobim.hangovers.gestionBudget.beans.comptes.Membre;
import fr.grobim.hangovers.gestionBudget.services.comptes.MembreService;

@Namespace(value = "/")
@ResultPath(value = "/")
public class GestionCompteAction extends AbstractActionSupport {

	private static final long serialVersionUID = 8651394204836948070L;

	private MembreChamps membreAjout;

	private Integer idMembreSelectionne;

	private MembreChamps membreModif;

	@Autowired
	private MembreService membreService;

	@Action(value = "ajouterMembre", results = { @Result(location = "compte.gererComptes.lister", type = "tiles") })
	public String ajouterMembre() {
		if (this.membreService.existeMembreAvecSurnom(this.membreAjout.getSurnom()).booleanValue()) {
			this.addActionError(this.getText("comptes.comptes.ajouterCompte.erreur.surnom.existant"));
			this.chargerPanelAjout(Boolean.FALSE);
			return SUCCESS;
		}
		Membre membreAAjouter = new Membre();
		membreAAjouter.setSurnom(this.membreAjout.getSurnom());
		membreAAjouter.setCommentaires(this.membreAjout.getCommentaire());
		CompteUtilisateur compte = new CompteUtilisateur();
		if (this.membreAjout.getUtilisateurInterne().booleanValue()) {
			if (StringUtils.isEmpty(this.membreAjout.getLogin())) {
				this.addActionError(this.getText("comptes.comptes.ajouterCompte.erreur.login.requis"));
				this.chargerPanelAjout(Boolean.FALSE);
				return SUCCESS;
			} else if (StringUtils.isEmpty(this.membreAjout.getMotDePasse())
					|| StringUtils.isEmpty(this.membreAjout.getMotDePasseConfirmation())) {
				this.addActionError(this.getText("comptes.comptes.ajouterCompte.erreur.motDePasse"));
				this.chargerPanelAjout(Boolean.FALSE);
				return SUCCESS;
			} else if (!StringUtils.equals(this.membreAjout.getMotDePasse(),
					this.membreAjout.getMotDePasseConfirmation())) {
				this.addActionError(this.getText("comptes.comptes.ajouterCompte.erreur.motDePasse.confirmation"));
				this.chargerPanelAjout(Boolean.FALSE);
				return SUCCESS;
			} else {
				if (this.membreService.existeMembreAvecLogin(this.membreAjout.getLogin())) {
					this.addActionError(this.getText("comptes.comptes.ajouterCompte.erreur.login.existant"));
					this.chargerPanelAjout(Boolean.FALSE);
					return SUCCESS;
				}
				compte.setLogin(this.membreAjout.getLogin());
				compte.setMotDePasse(DigestUtils.md5Hex(this.membreAjout.getMotDePasse()));
			}
		}
		membreAAjouter.setCompteUtilisateur(compte);
		this.membreService.creerOuMettreAJourMembre(membreAAjouter);
		this.addActionMessage(this.getText("comptes.comptes.ajouterCompte.confirmation"));
		this.chargerPanelAjout(Boolean.TRUE);
		return SUCCESS;
	}

	@Action(value = "afficherDetailMembre", results = { @Result(location = "compte.gererComptes.lister", type = "tiles") })
	public String afficherDetailMembre() throws Exception {
		this.chargerPanelAjout(Boolean.TRUE);
		this.chargerPanelModif();
		getSession().put(AttributsSession.GESTION_FACTURE_ID_FACTURE.getClee(), this.idMembreSelectionne);
		return SUCCESS;
	}

	@Action(value = "modifierMembre", results = { @Result(location = "compte.gererComptes.lister", type = "tiles") })
	public String modifierMembre() {
		this.idMembreSelectionne = null;
		this.chargerPanelAjout(Boolean.TRUE);
		return SUCCESS;
	}
	
	@Action(value = "supprimerMembre", results = {@Result(location = "compte.gererComptes.lister", type = "tiles")})
	public String supprimerMembre() {
		try {
			this.membreService.supprimerMembre(this.idMembreSelectionne);
		} catch (DataIntegrityViolationException e) {
			this.addActionError(this.getText("comptes.comptes.supprimerCompte.erreur"));
			this.chargerPanelAjout(Boolean.FALSE);
			return SUCCESS;
		}
		this.idMembreSelectionne = null;
		this.chargerPanelAjout(Boolean.TRUE);
		return SUCCESS;
	}

	private void chargerPanelAjout(Boolean _viderChamps) {
		if (_viderChamps.booleanValue()) {
			this.membreAjout = new MembreChamps();
		}
	}

	private void chargerPanelModif() {
		this.membreModif = new MembreChamps(this.membreService.obtenirMembre(this.idMembreSelectionne));
	}

	public MembreChamps getMembreAjout() {
		return membreAjout;
	}

	public void setMembreAjout(MembreChamps membreAjout) {
		this.membreAjout = membreAjout;
	}

	public Integer getIdMembreSelectionne() {
		return idMembreSelectionne;
	}

	public void setIdMembreSelectionne(Integer idMembreSelectionne) {
		this.idMembreSelectionne = idMembreSelectionne;
	}

	public MembreChamps getMembreModif() {
		return membreModif;
	}

	public void setMembreModif(MembreChamps membreModif) {
		this.membreModif = membreModif;
	}

}
